Extensión de Quarto® surveydown

Encuentro 10

Encuestas


La mayoría de las plataformas de encuestas (por ejemplo, Google Forms, etc.) utilizan interfaces que no son reproducibles y muchas requieren una licencia paga para su uso.


El paquete {surveydown} fue diseñado para abordar estos problemas. Basado en una integración entre Quarto/Markdown y Shiny, se puede alojar en línea haciendo que sea fácil reproducir, compartir y controlar la versión de la encuesta.


Los datos recopilados se pueden almacenar en una base de datos Postgres separada (recomendamos Supabase por ser gratuito y de código abierto).

Esquema

Instalación

El paquete {surveydown} tiene su sitio oficial en https://surveydown.org// y se instala desde CRAN:

  • Ejecutando en consola install.packages("surveydown") o desde el panel Packages de RStudio.

  • La última versión de CRAN es la 0.5.1 y la alojada en su sitio de desarrollo 0.7.1

  • La versión de desarrollo se puede instalar ejecutando:

# install.packages("pak")
pak::pak('surveydown-dev/surveydown')
  • El paquete tiene una función que a partir de una plantilla nos ayuda a cear el proyecto de encuesta facilmente. - ver Template

  • En https://surveydown.org/demos hay algunos demos para visualizar.

Comenzamos

Para comenzar debemos tener instalado R + RStudio + Quarto + paquete surveydown.

Luego podemos usar la función surveydown::sd_create_survey("path/to/folder") para construir un proyecto inicial a partir de la plantilla.

Nota

Cada encuesta creada con {surveydown} debe estar en su propia carpeta de proyecto separada.

Por ejemplo, si ejecutamos surveydown::sd_create_survey("Encuesta_prueba") estaremos creando la carpeta Encuesta_prueba

Proyecto

Un proyecto básico de surveydown consiste en tres archivos:

  • El archivo Rproj propio de cualquier proyecto de RStudio


  • survey.qmd: Un documento Quarto que contiene el contenido de la encuesta (páginas, preguntas, etc.), que se convierte en un archivo HTML.


  • app.R: Un script R que define una aplicación Shiny que contiene la configuración global (bibliotecas, configuración de la base de datos, etc.) y las opciones de configuración del servidor (por ejemplo, omisión/visualización condicional, etc.).

survey.qmd


Como todo archivo Quarto tendrá su cabecera YAML y su cuerpo desarrollado en markdown/Quarto con inserciones de código R.


La cabecera tiene que definir su salida como HTML y opcionalmente se puede agregar configuraciones estéticas y otras opciones.

---
format: html
echo: false
warning: false
theme: [simple, custom.css]
barcolor: "#DF7401"
barposition: top 
---

survey.qmd


En el cuerpo del archivo Quarto se declaran los componentes de la encuesta y se definen las páginas.

Las páginas se añaden con:

::: {#pagina1 .sd-page}

Pagina 1 escriba el contenido aquí

:::

La función para agregar preguntas es sd:question() que tiene varios argumentos que cambian según el tipo de pregunta.

Existen 12 formas distintas (ver Tipos de pregunta )

Shiny


El componente shiny es el encargado de configurar las opciones de servidor y la lógica de control condicional de la encuesta.

Se agrega código dentro del apartado server() del archivo app.R.

server <- function(input, output, session) {
 
  # contenido del servidor shiny
   
}

Las funciones principales para el control condicional son:

  • sd_skip_if(): salto condicional

  • sd_show_if(): muestra/oculta según condición

Base de datos


El paquete {surveydown} está diseñado para funcionar con cualquier base de datos PostgreSQL.

Los desarrolladores del paquete recomiendan usar Supabase, que es un servicio de base de datos PostgreSQL gratuito y de código abierto.


Antes de iniciar con la primera encuesta hay que realizar tres pasos con Supabase:

  1. Crear una cuenta Supabase
  2. Crear un proyecto Supabase
  3. Copia tus credenciales

Supabase

Ingresando al sitio de Supabase pulsamos sobre el botón Start your project.

En la siguiente pagina hay que loguearse. Podemos hacerlo automáticamente con una cuenta de github o crear una nueva cuenta en el sitio (con email y password).

Luego creamos nuestra organización, con el nombre, el tipo de uso (Personal, educacional, etc) y el plan (gratuito $ 0 por mes). Finalmente pulsamos sobre Create organization.

Proyecto en Supabase


En la página siguiente se define el proyecto de base de datos. A partir de declarar su nombre, la contraseña y la región (para Sudamérica usamos el servidor de San Pablo - Brasil)

Credenciales de Supabase


Junto con el password de la base de datos, necesitamos copiar las credenciales y parámetros de conexión para incluirlos en el proyecto de Quarto + Shiny.


Los parámetros de conexión los conseguimos pulsando sobre el botón Project Settings del menú lateral izquierdo y luego en Configuration -> Database.

Credenciales de Supabase

Las credenciales copiadas debemos declararlas en el archivo app.R donde se define sel sevidor shiny.

db <- sd_database(
  host   = "",
  dbname = "",
  port   = "",
  user   = "",
  table  = "any_name"
)

Pegamos los primeros 4 parámetros de tu página de Supabase en sd_database() (“host”, “dbname”, “port” y “user”). La contraseña debe definirse en sd_set_password() en la consola de R (No en en el archivo app.R)

El parámetro table puede ser cualquier nombre que deseemos para denominar a la tabla creada.

Credenciales de Supabase

Definimos el ejemplo de Encuesta_prueba, al que conviene incorporar el argumento ignore = TRUE, mientras editamos la encuesta localmente y de esta forma evitar que se conecte. En su lugar, se creará un archivo local preview_data.csv en la carpeta de proyecto para poder obtener una vista previa de los datos de la encuesta.

Nota

Un proyecto de Supabase puede admitir varias encuestas de Surveydown, pero se recomienda tener solo una encuesta por proyecto para evitar posibles errores.

Vista previa


Para ejecutar y renderizar la encuesta debemos pulsar el botón Run App del shiny (no renderizar el archivo .qmd como hacemos habitualmente en Quarto) o ejecutamos en consola la función runApp().

Preguntas

La función para crear preguntas es sd_question() y tiene tres argumentos:

  • id: identificador único para la pregunta, que se utilizará como nombre de la variable en los datos de la encuesta resultante.

  • label: etiqueta que se mostrará en la pregunta en la encuesta.

  • type: tipo de pregunta.

sd_question(
  type  = 'mc',
  id    = 'sexo',
  label = "Sexo",
  option = c(
    'Mujer'    = 'mujer',
    'Varón' = 'varon',
    'No binario'    = 'no_binario'
  )
)

Tipo de preguntas


Existen 12 tipos diferentes de preguntas:

  • Numérica
  • Texto (una sola línea o párrafo)
  • Multiple choice (una sola respuesta o respuesta múltiple)
  • Botones (verticales u horizontales - una sola respuesta o respuesta múltiple)
  • Fecha y rango de fecha
  • Deslizamiento
  • Matriz

Otras configuraciones


El server acepta otras configaciones generales, como:

  • Definir página inicio

  • Auto scroll de la encuesta

  • Traducción del sistema a otros idiomas (botones predeterminados)

  • Activar la calificación de preguntas

  • Agregar página de administración

Otras características


Además se pueden incorporar otras funcionalidades a la encuesta:

  • Preguntas obligatorias

  • Reactividad (interactividad aprovechando shiny)

  • Aleatorización de preguntas

  • Recursos externos (imágenes, etc)

  • Redireccionamiento externo (links web)

Implementación


Las encuestas se pueden implementar en servidores que soporten shiny, como por ejemplo shinyapps.io. También se pueden utilizar Posit Connect Cloud, Hugging Face y Heroku.

El sitio oficial donde se encuentra la documentación del paquete describe detalladamente los paso a paso para publicar en shinyapps.io y enlaces externos para los otros servidores mencionados.


El ejemplo mostrado en las diapositivas, se encuentra en:

https://datos-ine.shinyapps.io/Encuesta_prueba/